package br.com.ufrj.dcc.ad.simulacao.teste;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import br.com.ufrj.dcc.ad.simulacao.modelo.Cliente;
import br.com.ufrj.dcc.ad.simulacao.modelo.Fila;
import br.com.ufrj.dcc.ad.simulacao.modelo.Servidor;

public class MainTeste {
	public static void main(String[] args) {
//		Fila fila = new Fila(Fila.FILA_LIFO);
//		fila.getFilaClientes().add(new Cliente(0));
//		fila.getFilaClientes().add(new Cliente(1));
//		fila.getFilaClientes().add(new Cliente(2));
//		fila.getFilaClientes().add(new Cliente(3, Cliente.MAIOR_PRIORIDADE));
//		
//		System.out.println(fila.getFilaClientes());
//		
//		Collections.sort(fila.getFilaClientes(), fila.getComparetor());
//		
//		System.out.println(fila.getFilaClientes());
		
		Fila fila = new Fila(Fila.FILA_FIFO);
		Servidor servidor = new Servidor(Servidor.ON_OFF);
		List<Cliente> clientesAtendidos = new ArrayList<Cliente>();
		
		Random r = new Random(System.currentTimeMillis());
		
		int ciclo = 0;
		
		//1 chegada a cada 10 ciclos
		int intervaloChegadas = 10;
		
		//1 servico a cada 15 ciclos
		int intervaloServico = 15;
		
		int idCliente = 0;
		boolean entrouAlguem = false;
		
		int tempoEspera = 0;
		
		while (clientesAtendidos.size() < 1500) {
			
			if (ciclo%intervaloChegadas == 0) {
				entrouAlguem = false;
			}
			
			//se acabou o tempo de servido do cliente no servidor
			if (servidor.getOcupado() && servidor.getCliente().getTempoServico()%intervaloServico == 0) {
				clientesAtendidos.add(servidor.getCliente());
				
				servidor.setOcupado(false);
				servidor.setCliente(null);
			}
			
			//adiciono alguem na fila
			if (r.nextInt()%2 == 0 && !entrouAlguem) {
				if (!servidor.getOcupado()) {
					servidor.setOcupado(true);
					servidor.setCliente(new Cliente(idCliente));
				} else {
					fila.getFilaClientes().add(new Cliente(idCliente));
				}	
				
				idCliente++;
				entrouAlguem = true;
			}
			
			//alguem entra no servidor se ele estiver ocioso e se tem alguem na fila
			if (!servidor.getOcupado() && fila.getFilaClientes().size() > 0) {
				servidor.setCliente(fila.getFilaClientes().get(0));
				fila.getFilaClientes().remove(0);
				
				tempoEspera += servidor.getCliente().getTempoEspera();
				
				System.out.println(servidor.getCliente().getTempoEspera());
			}
			
			//finalizacao do ciclo
			//incrementa o tempo de espera de todos os clientes da fila
			for (Cliente c : fila.getFilaClientes()) {
				c.setTempoEspera(c.getTempoEspera()+1);
			}
			
			//incrementa o tempo de servico do cliente no servidor
			if (servidor.getOcupado()) {
				int tempoServico = servidor.getCliente().getTempoServico()+1;
				servidor.getCliente().setTempoServico(tempoServico);
			}
			
			ciclo++;
		}
		
		System.out.println("Clientes atendidos: "+clientesAtendidos.size());
		System.out.println("Tempo médio de espera: "+tempoEspera/clientesAtendidos.size());
	}
}
